package br.com.ufpr.util.base;

import org.apache.log4j.Logger;
import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseAtInterceptPageException;
import org.apache.wicket.authorization.Action;
import org.apache.wicket.authorization.IAuthorizationStrategy;
import org.apache.wicket.authorization.IUnauthorizedComponentInstantiationListener;
import org.apache.wicket.request.component.IRequestableComponent;

import br.com.ufpr.sgp.pages.AcessoNegadoPage;
import br.com.ufpr.sgp.pages.LoginPage;
import br.com.ufpr.sgp.util.session.CustomSession;

/**
 * Implementação da autenticação do wicket
 *
 * @author Willian Tanaka
 *
 */
public final class AuthorizationStrategy implements IAuthorizationStrategy, IUnauthorizedComponentInstantiationListener {
    private static final Logger log = Logger.getLogger(AuthorizationStrategy.class);

    public void onUnauthorizedInstantiation(Component component) {
        log.error("Instanciação não permitida, " + component.toString()
                + (CustomSession.get().isLogado() ? CustomSession.get().getUsuario().getNomeUsuario() : "NÃO LOGADO"));
        if (CustomSession.get().isLogado()) {
            throw new RestartResponseAtInterceptPageException(new AcessoNegadoPage(component.getClass().getCanonicalName()));

        } else {
            throw new RestartResponseAtInterceptPageException(LoginPage.class);
        }
    }

    @Override
    public <T extends IRequestableComponent> boolean isInstantiationAuthorized(Class<T> componentClass) {
        log.debug("Verificando se a instanciação é permitida... Classe: " + componentClass.getCanonicalName());
        if (componentClass.isAnnotationPresent(Protected.class)) {
            log.debug("Classe é protegida, verificando a existencia do id do usuário em sessão...");

            if (!CustomSession.get().isLogado()) {
                log.debug("################Usuario não logado....");
                return false;

            } else {
                final Protected pro = componentClass.getAnnotation(Protected.class);
                if (pro.adminOnly() || pro.desenvolvedorOnly() || pro.integradorOnly()) {
                    return CustomSession.get().getUsuario().isAdmin();


                } else {
                    return true;
                }
            }

        } else {
            log.debug("Classe NÃO é protegida... Retornando OK...");
            return true;

        }
    }

    public boolean isActionAuthorized(Component component, Action action) {
        return true;
    }

}